/*
当然trait 也可以是泛型的。我们在这里定义了一个trait，它把 `Drop trait`作为泛型方法实现了，
可以 `drop` 调用者本身和一个输入参数
*/

// 不可复制的类型
struct Empty;
struct Null;

// `T`的泛型triat
trait DoubleDrop<T> {
    // 定义一个调用者的方法，接受一个额外的参数 `T`, 但不对它做任何事
    fn double_drop(self, _: T);
}

// 对泛型的调用者类型 `U`和任何泛型类型 `T`实现 `DoubleDrop<T>`
impl <T, U> DoubleDrop<T> for U {
    // 此方法获得两个传入参数的所有权，并解释它们
    fn double_drop(self, _: T) {

    }
}

fn main() {
    let empty = Empty;
    let null = Null;

    // 释放 `empty` 和 `null`
    empty.double_drop(null);

    // empty;
    // null;
    // ^ empty, null 也无所有权，不能再访问
}